package com.springboot.mqtt.util;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.UUID;

/**
 * MQTT工具类
 * 
 * <p>提供MQTT操作相关的通用工具方法，如生成客户端ID、验证主题格式、解析服务器地址等。</p>
 * 
 * @author nehc
 * @version 1.0.0
 * @since 2023-04-01
 */
public class MqttUtils {
    
    /**
     * 生成随机的MQTT客户端ID
     * 
     * @param prefix 客户端ID前缀
     * @return 生成的客户端ID
     */
    public static String generateClientId(String prefix) {
        if (prefix == null || prefix.isEmpty()) {
            prefix = "mqtt-client";
        }
        return prefix + "-" + UUID.randomUUID().toString().substring(0, 8);
    }
    
    /**
     * 验证MQTT服务器URI格式
     * 
     * @param serverUri MQTT服务器URI
     * @return 是否有效
     */
    public static boolean isValidServerUri(String serverUri) {
        if (serverUri == null || serverUri.isEmpty()) {
            return false;
        }
        
        try {
            URI uri = new URI(serverUri);
            String scheme = uri.getScheme();
            return scheme != null && 
                   (scheme.equals("tcp") || 
                    scheme.equals("ssl") || 
                    scheme.equals("ws") || 
                    scheme.equals("wss"));
        } catch (URISyntaxException e) {
            return false;
        }
    }
    
    /**
     * 验证MQTT主题格式
     * 
     * @param topic MQTT主题
     * @return 是否有效
     */
    public static boolean isValidTopic(String topic) {
        // MQTT主题格式规则:
        // 1. 不能使用#或+作为第一个字符
        // 2. 主题层级使用/分隔
        // 3. 主题可以包含空格
        // 4. 主题区分大小写
        // 5. 主题不能为空
        if (topic == null || topic.isEmpty()) {
            return false;
        }
        
        // 不能以/开头或结尾
        if (topic.startsWith("/") || topic.endsWith("/")) {
            return false;
        }
        
        // 不能有连续的/
        if (topic.contains("//")) {
            return false;
        }
        
        // 通配符#只能在主题末尾，且前面必须是/
        if (topic.contains("#") && (!topic.endsWith("#") || !topic.endsWith("/#"))) {
            return false;
        }
        
        // +只能单独作为一个层级
        String[] levels = topic.split("/");
        for (String level : levels) {
            if (level.contains("+") && !level.equals("+")) {
                return false;
            }
        }
        
        return true;
    }
    
    /**
     * 判断是否为有效的QoS级别
     * 
     * @param qos QoS级别
     * @return 是否有效
     */
    public static boolean isValidQos(int qos) {
        return qos >= 0 && qos <= 2;
    }
    
    /**
     * 解析MQTT服务器地址，获取主机名部分
     * 
     * @param serverUri MQTT服务器URI
     * @return 主机名，解析失败则返回null
     */
    public static String getHostFromServerUri(String serverUri) {
        if (!isValidServerUri(serverUri)) {
            return null;
        }
        
        try {
            URI uri = new URI(serverUri);
            return uri.getHost();
        } catch (URISyntaxException e) {
            return null;
        }
    }
    
    /**
     * 解析MQTT服务器地址，获取端口部分
     * 
     * @param serverUri MQTT服务器URI
     * @return 端口号，如果URI中未指定端口，则返回协议默认端口
     */
    public static int getPortFromServerUri(String serverUri) {
        if (!isValidServerUri(serverUri)) {
            return -1;
        }
        
        try {
            URI uri = new URI(serverUri);
            int port = uri.getPort();
            if (port == -1) {
                // 使用协议默认端口
                String scheme = uri.getScheme();
                if ("tcp".equals(scheme) || "mqtt".equals(scheme)) {
                    return 1883;
                } else if ("ssl".equals(scheme) || "mqtts".equals(scheme)) {
                    return 8883;
                } else if ("ws".equals(scheme)) {
                    return 8083;
                } else if ("wss".equals(scheme)) {
                    return 8084;
                }
            }
            return port;
        } catch (URISyntaxException e) {
            return -1;
        }
    }
} 